package provajbehave;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.Matchers.notNullValue;

import java.util.Map;

import org.jbehave.core.annotations.*;

public class ContatoreAzzerabileSteps {

	private Contatore contatore;

	private Map<String, Object> allSymbols;

	public ContatoreAzzerabileSteps(Map<String, Object> allSymbols) {
		this.allSymbols = allSymbols;
	}

	@Given("un contatore con massimo $max e valore corrente $currentValue")
	public void unContatore(@Named("max") int max, @Named("currentValue") int currentValue) {
		contatore = new Contatore(max);
		contatore.incrementOf(currentValue);
	}

	@Given("un contatore $contatoreSymbol con valore massimo $max e valore corrente $currentValue")
	public void unContatore(String contatoreSymbol, int max, int currentValue) {
		Contatore contatore = new Contatore(max);
		contatore.incrementOf(currentValue);
		allSymbols.put(contatoreSymbol, contatore);
	}

	@When("incremento di $value")
	public void incremento(int value) {
		contatore.incrementOf(value);
	}

	@When("decremento di $value")
	public void decremento(@Named("decrement") int value) {
		contatore.decrementOf(value);
	}

	@When("resetto")
	public void resetto() {
		contatore.reset();
	}

	@When("creo un contatore con valore massimo $max")
	public void creoUnContatoreConMassimo(int max) {
		try {
			contatore = new Contatore(max);
		} catch (RuntimeException rte) {
			contatore = null;
		}
	}

	@Then("il valore corrente è $currentValue")
	public void valoreCorrente(@Named("newValue") int currentValue) {
		assertThat(contatore.getValue(), equalTo(currentValue));
	}

	@Then("ho un contatore")
	public void hoUnContatore() {
		assertThat(contatore, notNullValue());
	}

	@Then("non ho un contatore")
	public void nonHoUnContatore() {
		assertThat(contatore, nullValue());
	}

	@Then("il contatore $contatoreSymbol ha valore corrente $value")
	public void valoreCorrente(String contatoreSymbol, int value) {
		Contatore contatore = (Contatore) allSymbols.get(contatoreSymbol);
		assertThat(contatore.getValue(), equalTo(value));
	}
}
